package cn.edu.wynu.apis.string;

import cn.edu.wynu.apis.common.CommonFunctions;

public class StringAPI {
    public static void main(String[] args) {
        stringFeatures();

        stringAPIs();
    }

    private static void stringAPIs() {
        CommonFunctions.cutBlock("2. 字符串常用API");
        // 字符串常用API
        String s1 = "Hello";
        // 1. 字符串长度
        System.out.println("s1的长度为: " + s1.length());

        // 2. 字符串拼接
        System.out.println("s1拼接World的结果为: " + (s1 + " World"));

        // 3. 字符串截取
        System.out.println("s1从索引1到索引4的子字符串为: " + s1.substring(1, 4));

        // 4. 字符串替换
        System.out.println("s1替换Hello为Hi的结果为: " + s1.replace("Hello", "Hi"));

        // 5. 字符串分割
        String s5 = "a,b,c,d";
        String[] s6 = s5.split(",");
        for (String s : s6) {
            System.out.print(s + " ");
        }

        // 6. 字符串转换
        System.out.println("s1转换为大写为: " + s1.toUpperCase());
        System.out.println("s1转换为小写为: " + s1.toLowerCase());

        // 7. 空格处理
        System.out.println("s1去除首尾空格为: " + s1.trim());
    }

    private static void stringFeatures() {
        // 1. String 其实也是一个类,但是java编译器对String类型有特殊处理
        CommonFunctions.cutBlock("1. 字符串特点");
        String s1 = "Hello";

        // 上面的语句相当于
        String s2 = new String(new char[] {'H', 'e', 'l', 'l', 'o'});
        System.out.println("s2为: " + s2);

        // 2. String特点: String对象一旦创建,就不能被改变,原因是内部实现是基于char数组(jdk9及以后的版本使用byte数组)前面加了final关键字
        s1 = s1 + " World";
        // 上面的语句虽然显示是在改变s1,但是实际上是创建了一个新的String对象,
        // 并把s1指向了新的对象,原始的"Hello"对象还在内存中,只是s1不再指向它
        System.out.println("s1为: " + s1);

        // 3. 字符串比较, 不能使用==比较, 因为==比较的是对象的引用,而不是对象的内容
        // 应该使用equals方法比较字符串的内容
        String s3 = "abc";
        String s4 = "abc";
        System.out.println("s3和s4的内容是否相等: " + s3.equals(s4));
        // 这里直接 == 比较虽然结果是相等,但是还是不能这样比较,
        // 这里相等的原因是:字符串常量池机制,如果常量池中已存在"abc",
        // 那么s3和s4指向的都是常量池中的"abc",所以==比较结果是相等的
        System.out.println("s3和s4的引用是否相等: " + (s3 == s4));
    }
}
